/**
 * @author yangbing
 * @time 2022-07-01 17PM
 * @description axios封装
 */

//这里我们需要引入axios 先安装依赖 cnpm install axios
import axios from 'axios'
//这里我们是将我们的请求地址封装成一个常量  并将这个里面的东西解构赋值出来
import { LOGINCODE_URL, PHONECODE_URL,SAOMAPIAOJU_URL,LUNXUN_URL } from '../config/url.config'

//这里是引入我们的仓库
import store from '../store'
//这里我们创建一个axios对象
const Axios = axios.create({
    //这里我们配置通用路径 如果process.env.NODE_ENV 等于 development
    //那么就用我们的代理固定字符串请求  否则用http://www.shuiyue.info:21000 请求地址
    baseURL:process.env.NODE_ENV === 'development' ? '/apis' : 'http://www.shuiyue.info:21000',
    timeout:5000
})

//这里是我们的请求拦截  请求拦截对象 会有一个config对象
//这里要注意  要写成我们的创建的对象 不能写成引入的了
Axios.interceptors.request.use(config=>{
    //我们这里设置一个不用拦截的url地址数组
    //获取验证码和验证码登陆接口
    let urls = [
        PHONECODE_URL,
        LOGINCODE_URL,
        SAOMAPIAOJU_URL,
        LUNXUN_URL
    ]
    //这里和我们的config里面的url进行匹配 匹配成功 那么返回config  直接发送请求
    if(urls.includes(config.url)){
        return config
    }
    //这里我们去获取token
    let token = store.getters['common/token']

    //如果没有  那么我们需要拦截 提示用户
    if(!token){
        return Promise.reject({code:666,message:'前端请求拦截错误返回'})
    }
    //如果有 那么我们将token加在请求头上
    config.headers['X-Token'] = token
    //返回config
    return config
})

//这里是响应拦截  响应拦截会有一个响应对象
Axios.interceptors.response.use(response=>{
    //响应对象里面会有我们后端发给我们的data数据 我们将其解构出来
    let {data} = response
    //我们去判断  如果为403  那么拦截 并且提示用户
    if(data.code === 403){
        return Promise.reject({code:777,message:'用户token已经失效，请重新登陆'})
    }
    return data
})

//这里是导出我们的请求结果
export default req =>{
    //这里会直接判断用户是否输入了url地址 如果没有输入 那么提示
    if(!req.url){throw new TypeError('url参数必传')}

    return new Promise(resolve=>{
        //这里是请求  url  method  data是我们请求体 post put等  params  是请求头 get
        Axios.request({
            url:req.url,
            method:req.method || 'GET' ,
            data:req.data || {},
            params:req.params || {}
            //这里我们需要解构赋值出来
            //因为我们得到是一个对象
            //然后我们从对象里面把data解构赋值出来  然后返给前端
        }).then(data=>{
            resolve(data)
        }).catch(err=>{
            resolve(err)
        })
    })
}
